import { reqOrderAddress, reqOrderInfo, reqBuyNowGoods, reqSubmitOrder, reqPrePayInfo, reqPayStatus } from '../../../api/orderPay'
import { formatTime } from '../../../utils/formatTime'
//对参数进行验证
import Schema from "async-validator"
// 导入防抖函数
import { debounce } from 'miniprogram-licia'

const app = getApp()

Page({
  data: {
    buyName: '', // 订购人姓名
    buyPhone: '', // 订购人手机号
    deliveryDate: '', // 期望送达日期
    blessing: '', // 祝福语
    show: false, // 期望送达日期弹框
    orderAddress: {}, // 收货地址
    orderInfo: {}, // 订单详情列表
    minDate: new Date().getTime(),
    currentDate: new Date().getTime()
  },

  // 提交订单前验证
  submitOrder: debounce(async function() {
    const { 
        buyName,
        buyPhone,
        deliveryDate,
        blessing,
        orderAddress,
        orderInfo 
    } = this.data

    const params = {  
        buyName,
        buyPhone,
        cartList: orderInfo.cartVoList,
        deliveryDate,
        remarks: blessing,
        userAddressId: orderAddress.id
    }

    // 调用验证函数
    const { valid } = await this.vaildatorPerson(params)

    if(!valid) return

    // 创建平台订单
    const res = await reqSubmitOrder(params)

    if(res.code === 200) {
        this.orderNo = res.data
    
        this.advancePay()
    }

    },500),

  // 订单预支付 获取预支付单信息，支付参数
  async advancePay() {
      try {
        const res = await reqPrePayInfo(this.orderNo)
    
        if(res.code === 200) {
          // res.data 是支付参数
  
          // 调用wx.requestPayment进行微信支付，（因为没有商户授权，所以暂时无法使用）
          const payInfo = await wx.requestPayment( res.data )
          // 判断是否支付成功
          if(payInfo.errMsg === 'requestPayment:ok') {
            // 查询支付状态
            const payStatus = await reqPayStatus(this.orderNo)

            if(payStatus.code === 200) {
                wx.redirectTo({
                  url: '/modules/orderPayModule/pages/order/list/list',
                  success: () => {
                      wx.toast({
                          title: '支付成功',
                          icon: 'success'
                      })
                  }
                })
            }
          }
        }
      } catch (error) {
          wx.toast({
              title: '支付失败',
              icon: 'error'
          })
      }

  },

    // 验证规则函数
    vaildatorPerson(params) {
        // 验证收货人， 只包含大小写字母、数字和中文字符
        const nameRegExp = '^[a-zA-Z\\d\\u4e00-\\u9fa5]+$'
    
        // 验证手机号，符合中国大陆手机号码格式
        const phoneReg = '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$'
    
        // 创建验证规则
        const rules = {
            userAddressId: [{ required: true, message: '请选择收货地址' }],
            buyName: [
                { required: true, message: '请输入订购人姓名' },
                { pattern: nameRegExp, message: '订购人姓名不合法' }
            ],
            buyPhone: [
                { required: true, message: '请输入订购人手机号码' },
                { pattern: phoneReg, message: '订购人手机号码不合法' }
            ],
            deliveryDate: [{ required: true, message: '请选择期望送达日期' }]
        }
    
        // 传入验证规则进行实例化
        const validator = new Schema(rules)
    
        return new Promise((resolve) => {
            validator.validate(params, (errors) => {
                if(errors) {
                    wx.toast({ title: errors[0].message })
                    resolve({ valid: false })
                } 
                else { 
                    resolve({ valid: true })
                }
            })
        })
      },


  // 选择期望送达日期
  onShowDateTimerPopUp() {
    this.setData({
      show: true
    })
  },

  // 期望送达日期确定按钮
  onConfirmTimerPicker(event) {
    // event.detial 中获取到的是时间戳，需要使用formatTime.js中的 formatTime 方法来转换为时间
    // formatTime 需要使用js的日期对象作为参数
    const timeRes = formatTime(new Date(event.detail))

    this.setData({
      show: false,
      deliveryDate: timeRes
    })
  },

  // 期望送达日期取消按钮 以及 关闭弹框时触发
  onCancelTimePicker() {
    this.setData({
      show: false,
      minDate: new Date().getTime(),
      currentDate: new Date().getTime()
    })
  },

  // 跳转到收货地址
  toAddress() {
    wx.navigateTo({
      url: '/modules/settingModule/pages/address/list/index'
    })
  },

  // 获取收货地址
  async getAddress() {

    // 判断全局地址共享数据中是否有数据，如果有则用此数据
    const addressId = app.globalData.address.id

    if(addressId) {
        this.setData({
            orderAddress: app.globalData.address
        })
        return
    }


    // 如果没有，则从接口获取数据
    const res = await reqOrderAddress()
    if(res.code === 200) {
        const { data: orderAddress } = res
        this.setData({
            orderAddress
        })
    }
  },

  // 获取订单详情
  async getOrderInfo() {

    const { goodsId, blessing } = this.data
    // 判断是立即购买创建订单，还是从购物车创建订单
    const { data: orderInfo } = goodsId 
    ? await reqBuyNowGoods({ goodsId, blessing }) 
    : await reqOrderInfo()

    // 判断商品是否带有祝福语，如果有则放入订单备注中，如果有多个商品祝福语，则取第一个带有祝福语的商品的祝福语于备注中
    const orderGoods = orderInfo.cartVoList.find((item) => item.blessing !== '')  

    this.setData({
        orderInfo,
        blessing: !orderGoods ? '' : orderGoods.blessing
    })
  },

  // 接收立即购买传入的参数
  onLoad(options) {
    this.setData({
        ...options
    })
  },

  onShow() {
      this.getAddress()
      this.getOrderInfo()
  },

  onUnload() {
    // 页面销毁后，将全局地址共享数据清空，再次进入后使用默认地址（据情况而定，也可不清空，就使用全局地址共享数据）
    app.globalData.address = {}
  }


})
